#include <iostream>
#include <fstream>
#include <cctype>
#include <string>
using namespace std;
// 统计结构体
struct Stats {
    int chars;    // 字符数
    int words;    // 单词数
    int sentences;// 句子数
    int code;     // 代码行
    int empty;    // 空行
    int comment;  // 注释行
};
// 初始化统计数据
void initStats(Stats &s) {
    s.chars = s.words = s.sentences = 0;
    s.code = s.empty = s.comment = 0;
}

// 统计基础信息（字符、单词、句子）
void countBasic(ifstream &file, Stats &s) {
    char c;
    bool inWord = false;
    while (file.get(c)) {
        s.chars++;  // 统计所有字符
        
        // 单词判断（字母组成）
        if (isalpha(c)) {
            if (!inWord) {
                s.words++;
                inWord = true;
            }
        } else {
            inWord = false;
        }
        
        // 句子判断（.?!结尾）
        if (c == '.' || c == '!' || c == '?') {
            s.sentences++;
        }
    }
}

// 统计行信息（代码行、空行、注释行）
void countLines(ifstream &file, Stats &s) {
    string line;
    bool inBlockComment = false;
    
    while (getline(file, line)) {
        bool hasCode = false;
        bool isEmpty = true;
        bool isComment = false;
        
        for (size_t i = 0; i < line.size(); i++) {
            if (!isspace(line[i])) {
                isEmpty = false;
                
                // 单行注释
                if (i < line.size()-1 && line[i] == '/' && line[i+1] == '/') {
                    isComment = true;
                    break;
                }
                
                // 多行注释开始
                if (i < line.size()-1 && line[i] == '/' && line[i+1] == '*') {
                    inBlockComment = true;
                    isComment = true;
                    i++;
                    continue;
                }
                
                // 多行注释结束
                if (i < line.size()-1 && line[i] == '*' && line[i+1] == '/') {
                    inBlockComment = false;
                    i++;
                    continue;
                }
                
                // 注释块内
                if (inBlockComment) {
                    isComment = true;
                    continue;
                }
                
                hasCode = true;  // 存在有效代码
            }
        }
        
        // 行类型统计
        if (isEmpty) s.empty++;
        else if (isComment || inBlockComment) s.comment++;
        else if (hasCode) s.code++;
    }
}

int main(int argc, char *argv[]) {
    if (argc != 3) {
        cout << "用法: wc.exe [参数] [文件名]\n";
        cout << "参数:\n";
        cout << "  -c    统计字符数\n  -w    统计单词数\n  -s    统计句子数\n";
        cout << "  -l   统计代码行\n  -kl   统计空行\n  -zl 统计注释行\n";
        return 1;
    }

    string opt = argv[1];
    ifstream file(argv[2]);
    if (!file) {
        cout << "无法打开文件: " << argv[2] << endl;
        return 1;
    }

    Stats s;
    initStats(s);
    countBasic(file, s);
    
    // 重置文件指针用于行统计
    file.clear();
    file.seekg(0, ios::beg);
    countLines(file, s);
    file.close();

    // 输出结果
    if (opt == "-c") cout <<"字符数: " << s.chars << endl;
    else if (opt == "-w") cout << "\n单词数: " <<s.words << endl;
    else if (opt == "-s") cout << "\n句子数: " << s.sentences << endl;
    else if (opt == "-l") cout << "\n代码行: " <<s.code << endl;
    else if (opt == "-kl") cout << "\n空行: " <<s.empty << endl;
    else if (opt == "-zl") cout <<"\n注释行: " << s.comment << endl;
    else {
        cout << "无效参数: " << opt << endl;
        return 1;
    }

    return 0;
}